﻿using Microsoft.EntityFrameworkCore;

namespace MyToDo.Api.Context
{
    /// <summary>
    /// Entity Framework Core (EF Core) 的上下文类.上下文类是你的应用程序和数据库之间的主要桥梁.
    /// 它包含你的应用程序需要与数据库交互的所有的实体集(DbSet)
    /// DbContext提供了很多操作数据库的方法,比如添加,修改,删除和查询数据的.
    /// MyToDoContext的构造函数是被Entity Framework Core自动调用的。当你使用依赖注入（例如，在控制器中注入MyToDoContext），
    /// 或者直接创建MyToDoContext的实例时，Entity Framework Core会自动调用这个构造函数，并传入你在AddDbContext方法中配置的DbContextOptions。
    /// DbSet<ToDoEntity> 是Entity Framework Core的一个重要概念，它表示数据库中的一个表。
    /// 当你在MyToDoContext中定义一个DbSet<ToDoEntity> 属性时，Entity Framework Core会在数据库中创建一个对应的表（如果这个表还不存在的话）。

    /// Entity Framework Core使用一种叫做"Code First"的方法来创建和更新数据库。这种方法是根据你的.NET代码（
    /// 特别是你的DbContext和实体类）来自动创建和更新数据库的架构。你可以使用Entity Framework Core的迁移功能来管理这种自动创建和更新数据库的过程。
    /// </summary>
    public class MyToDoContext : DbContext
    {
        /// <summary>
        /// 关于base(Options),这是C#语言的一部分,当在派生类中显示调用基类构造函数的时候需要这么使用,至于为什么要这么使用:
        /// 原因有以下两点:
        /// 1) 这里如果不显示的调用基类的有参构造,就默认会调用无参构造,所以和我们项目需求不符合
        /// 2) 调用有参构造为什么一定要在在方法体外使用呢,因为base关键字调用基类的构造方法必须是放到第一个语句,如何保证呢,
        ///     在方法体外面就行了,不能放到方法体的原因是,在方法体中不可控制其位置.
        ///3)  为了满足一个条件就是基类的构造函数首先被调用.
        /// </summary>
        /// <param name="Options"></param>
        public MyToDoContext(DbContextOptions Options) : base(Options)
        {

        }
        public DbSet<ToDoEntity> Todo { get; set; }
        public DbSet<MemoEntity> Memo { get; set; }
        public DbSet<UserEntity> User { get; set; }
    }
}
